var express = require('express');
var router = express.Router();
const md5 = require('blueimp-md5')
const {UserModel, ChatModel} = require('../db/models')
const filter = {password: 0, __v: 0}  // 指定过滤的属性
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

// 注册一个路由：用户注册
/**
 * a) path为： /register
 * b) 请求方式为：POST
 * c) 接收username和password参数
 * d) 注册成功返回：{code:0, data:{_id:'abc', username: 'xxx', password:'123'}}
 * e) 注册失败返回：{code:1, msg:'此用户不存在'}
 * f) admin是已注册用户
 */
/**
 * 回调函数中三步：
 * 1. 获取请求参数
 * 2. 处理
 * 3. 返回相应数据
 */
// 注册的路由
router.post('/register', function (req, res){
  // 1. 获取请求参数
  const {username, password, type} = req.body
  // 2. 处理
    // 判断用户是否存在，如存在，提示错误； 如不存在，保存
  UserModel.findOne({username}, function(err, user){
    if(user){
      res.send({code: 1, msg: '此用户已存在'})
    }else{
      new UserModel({username, password: md5(password), type}).save(function(err, user){
        const data = {username, type, _id: user._id}
        res.cookie('userId', user._id, {maxAge: 100*60*60*24*7})  // 持久化cookie,数据会保存至本地
        res.send({code: 0, data: data}) // 返回数组不用携带密码
      })
    }
  })
})

router.post('/login', function(req, res){
  const {username, password} = req.body
  // 根据username和password查询数据库users，如果没有返回错误信息，如果有返回登录成功信息（包含user)
  UserModel.findOne({username, password:md5(password)},filter, function(err, user){
    if(user){
      res.cookie('userId', user._id, {maxAge: 100*60*60*24*7})  // 持久化cookie,数据会保存至本地
      // 返回登录成功的信息（包括user）
      res.send({code: 0, data: user})
    }else{
      res.send({code: 1, msg:'用户名或密码不正确'})
    }
    
  })
})

// 更新用户信息的路由
router.post('/update', function(req, res){
  // 从请求的cookie获得userId
  const userId = req.cookies.userId
  if(!userId){
    return res.send({ code: 1, msg: '请先登录'})
  }
  const user = req.body // 没有_id
  UserModel.findByIdAndUpdate({_id: userId}, user, function(error, oldUser){
    if(!oldUser){
      // 通知浏览器删除cookie中的userId
      res.clearCookie('userId')
      return res.send({code: 1, msg:'请先登录'})
    }

    const {_id, username, type} = oldUser
    const data = Object.assign(user, {_id, username, type})
    res.send({code: 0, data})

  })
})

// 根据cookie中id获取用户信息的路由
router.get('/user', function(req, res){
  // 从请求的cookie中获取userId
  const userId = req.cookies.userId
  if(!userId){
    return res.send({code: 1, msg: '请先登录'})
  }
  // 根据userId查询对应的user
  UserModel.findOne({_id: userId}, filter, function(error, user){
    res.send({code: 0, data: user})
  })
})

// 获取用户列表
router.get('/userList', function(req, res){
  const {type} = req.query
  UserModel.find({type}, filter, function(error, users){
    res.send({code: 0, data: users})
  })
})


/*
获取当前用户所有相关聊天信息列表
 */
router.get('/msgList', function (req, res) { 
  // 获取cookie中的userid
  const userId = req.cookies.userId
  // 查询得到所有user文档数组
  UserModel.find(function (err, userDocs) {
    // 用对象存储所有user信息: key为user的_id, val为name和header组成的user对象
    /*const users = {} // 对象容器
    userDocs.forEach(doc => {
      users[doc._id] = {username: doc.username, header: doc.header}
    })*/

    const users = userDocs.reduce((users, user) => {
      users[user._id] = {username: user.username, header: user.header}
      return users
    } , {})
    /*
    查询userid相关的所有聊天信息
     参数1: 查询条件
     参数2: 过滤条件
     参数3: 回调函数
    */
    ChatModel.find({$or: [{from: userId}, {to: userId}]}, filter, function (err, chatMsgs) {
      // 返回包含所有用户和当前用户相关的所有聊天消息的数据
      res.send({code: 0, data: {users, chatMsgs}})
    })
  })
})

/*
修改指定消息为已读
 */
router.post('/readmsg', function (req, res) {
  // 得到请求中的from和to
  const from = req.body.from
  const to = req.cookies.userId
  /*
  更新数据库中的chat数据
  参数1: 查询条件
  参数2: 更新为指定的数据对象
  参数3: 是否1次更新多条, 默认只更新一条
  参数4: 更新完成的回调函数
   */

  ChatModel.updateMany ({from, to, read: false}, {read: true}, function (err, doc) {
    res.send({code: 0, data: doc.modifiedCount}) // 更新的数量
  })
})


module.exports = router;

